//
//  WanAndroidAPI.swift
//  WanAndroidLearn
//
//  Created by TRS-Mobile on 2023/10/31.
//

import Foundation
import Moya
import MoyaSugar

/// 接口
enum WanAndroidAPI {
    /// 登录
    /// - Parameters:
    ///     - 方法: POST
    ///     - 参数: username，password
    ///
    /// 登录后会在cookie中返回账号密码，只要在客户端做cookie持久化存储即可自动登录验证。
    case login(username: String, password: String)
    /// 注册
    /// - Parameters:
    ///     - 方法: POST
    ///     - 参数: username,password,repassword
    case register(username: String, password: String, repassword: String)
    /// 退出 GET
    ///
    /// 访问了 logout 后，服务端会让客户端清除 Cookie（即cookie max-Age=0），
    /// 如果客户端 Cookie 实现合理，可以实现自动清理，如果本地做了用户账号密码和保存，及时清理。
    case logout
    /// 项目分类
    ///
    /// 项目为包含一个分类，该接口返回整个分类。
    /// ```
    /// [{
    /// "children": [],
    /// "courseId": 13,
    /// "id": 294, // 该id在获取该分类下项目时需要用到
    /// "name": "完整项目", // 该分类名称
    /// "order": 145000,
    /// "parentChapterId": 293,
    /// "visible": 0
    /// }]
    /// ```
    case projectTree
    /// 项目列表数据
    /// - Parameters:
    ///     - 方法: GET
    ///     - cid: 分类的id，上面项目分类接口，
    ///     - page: 拼接在链接中，从1开始。
    ///
    /// 某一个分类下项目列表数据，分页展示
    /// 注：该接口支持传入 page_size 控制分页数量，取值为[1-40]，不传则使用默认值，
    /// 一旦传入了 page_size，后续该接口分页都需要带上，否则会造成分页读取错误。
    ///
    case projectList(page: Int, cid: Int)
    /// 导航数据
    case naviData
    /// 文章列表 方法: GET
    /// - Parameters:
    ///     - cid: 分类的id，二级目录的id
    ///     - page: 拼接在链接上，从0开始。
    ///     - author: 作者昵称，不支持模糊匹配。
    ///
    /// 可直接点击查看示例：https://www.wanandroid.com/article/list/1/json。
    /// - 注意：页码从0开始，拼接在链接上。
    /// - 注：该接口支持传入 page_size 控制分页数量，取值为[1-40]，不传则使用默认值，一旦传入了 page_size，后续该接口分页都需要带上，否则会造成分页读取错误。
    ///
    /// 其中有两个易混淆的字段:
    /// ```
    /// "superChapterId": 153,
    /// "superChapterName": "framework", // 一级分类的名称
    /// ```
    /// `superChapterId`其实不是一级分类id，因为要拼接跳转url，内容实际都挂在二级分类下，
    /// 所以该id实际上是一级分类的第一个子类目的id，拼接后故可正常跳转。
    ///
    /// 有两个字段比较容易混淆：```author``` 与 ```shareUser```
    /// 网站上的文章可能是某位作者`author`的，也可能是某位分享人`shareUser`分享的。
    /// 如果是分享人分享的，`author` 为 `null`。
    ///
    /// 注意：除了文字标题，链接，其他字段都可能为null，一定要注意布局下发 null 时的显示情况。
    case articleList(page: Int, cid: Int?, author: String?)
    /// 首页banner
    ///
    /// 可直接点击查看示例：https://www.wanandroid.com/banner/json
    case bannerList
    /// 常用网站
    ///
    /// 可直接点击查看示例：https://www.wanandroid.com/friend/json
    case friendWebSite
    /// 搜索热词
    ///
    /// 即目前搜索最多的关键词。可直接点击查看示例：https://www.wanandroid.com/hotkey/json
    case hotkeyList
    /// 置顶文章 https://www.wanandroid.com/article/top/json
    case articleTopList
    /// 体系数据
    ///
    /// 可直接点击查看示例：https://www.wanandroid.com/tree/json
    /// 主要标识的网站内容的体系结构，二级目录。部分数据参考：
    /// ```
    /// {
    ///    "children": [
    ///        {
    ///            "children": [],
    ///            "courseId": 13,
    ///            "id": 60, // id会在查看该目录下所有文章时有用
    ///            "name": "Android Studio相关", // 子名称
    ///            "order": 1000,
    ///            "parentChapterId": 150,
    ///            "visible": 1
    ///        },...
    ///    ],
    ///    "courseId": 13,
    ///    "id": 150,
    ///    "name": "开发环境", // 一级的名称
    ///    "order": 1,
    ///    "parentChapterId": 0,
    ///    "visible": 1
    ///}
    /// ```
    case treeList
    /// 收藏文章列表 page：拼接在链接中，从0开始。
    case collectList(page: Int)
    /// 收藏站内文章
    /// id: 文章id，拼接在链接中。
    case collect(id: Int)
}

extension WanAndroidAPI: SugarTargetType {
    
    var route: MoyaSugar.Route {
        switch self {
        case .login(_, _):
            return .post("/user/login")
        case .register(_, _, _):
            return .post("/user/register")
        case .logout:
            return .get("/user/logout/json")
        case .projectTree:
            return .get("/project/tree/json")
        case .projectList(let page, let cid):
            return .get("/project/list/\(page)/json?cid=\(cid)")
        case .naviData:
            return .get("/navi/json")
        case .articleList(let page, let cid, let author):
            var str = "/article/list/\(page)/json"
            if let cid {
                return .get(str + "?cid=\(cid)")
            }
            if let author {
                return .get(str + "?author=\(author)")
            }
            return .get(str)
        case .bannerList:
            return .get("/banner/json")
        case .friendWebSite:
            return .get("/friend/json")
        case .hotkeyList:
            return .get("/hotkey/json")
        case .articleTopList:
            return .get("/article/top/json")
        case .treeList:
            return .get("/tree/json")
        case .collectList(let page):
            return .get("/lg/collect/list/\(page)/json")
        case .collect(let id):
            return .post("/lg/collect/\(id)/json")
        }
    }
    
    var parameters: MoyaSugar.Parameters? {
        switch self {
        case .login(let username, let password):
            return ["username": username, "password": password]
        case .register(let username, let password, let repassword):
            return ["username": username, "password": password, "repassword": repassword]
        default:
            return nil
        }
    }
    
    var baseURL: URL {
        return URL(string: "https://www.wanandroid.com")!
    }
    
    var headers: [String : String]? {
        return ["Accept": "application/json"]
    }
    
    
}
